package cn.tedu.file;

import java.io.*;
import java.util.Scanner;

/*本类用于练习文件复习综合案例*/
public class TestCopyFile {
    public static void main(String[] args) {
        //提示并接受用户输入的两个路径
        System.out.println("请输入源文件路径");//--被复制的文件
        String f = new Scanner(System.in).nextLine();
        System.out.println("请输入新文件路径");//--复制好的文件
        String t = new Scanner(System.in).nextLine();

        //调用创建好的自定义方法完成文件的复制
        //ZFCopy(f,t);//用字符流完成文件的复制案例
        ZJCopy(f,t);//用字节流完成文件的复制案例
    }
    //利用字节流完成文件复制案例
    private static void ZJCopy(String f, String t) {
        InputStream in = null;
        OutputStream out = null;
        try{
            in = new BufferedInputStream(new FileInputStream(f));
            out = new BufferedOutputStream(new FileOutputStream(t));
            int b;
            while((b=in.read())!=-1){
                out.write(b);
            }
            System.out.println("恭喜您,文件复制成功!");
        }catch(Exception e){
            System.out.println("很抱歉.文件复制失败!");
            e.printStackTrace();
        }finally{
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
    //利用字符流完成文件赋值案例
    private static void ZFCopy(String f, String t) {
        //定义在整个方法中都生效
        Reader in = null;
        Writer out = null;
        try{
             in = new BufferedReader(new FileReader(new File(f)));
             out = new BufferedWriter(new FileWriter(new File(t)));
             //拿到流对象以后,就可以使用流对象来完成业务了
            int b;
            //循环读到源文件,直到返回值为-1,说明没有数据了,再结束循环
            while((b=in.read())!=-1){
                //將本轮循环中读到的数据写入到新文件中
                out.write(b);
            }
            System.out.println("恭喜你,文件复制成功了");
        }catch(Exception e){
            System.out.println("很抱歉,文件复制失败了");
            e.printStackTrace();
        }finally{
            /*关流是有顺序的:如果有多个流,最后创建的流最先关闭
            * 多条关流语句需要各自try-catch*/
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
